#include "app_iap.h"

/* 全局变量 */
iapfun 		jump_to_app; // 函数指针

/**
***********************************************************
* @brief	跳转到用户程序 
* @param 	用户程序地址
* @return 
***********************************************************
*/
void app_load(uint32_t addr)
{
	DBG_log("jump to user:0x%x",addr);
	/* 检查目标地址是否有效 */
	if(((*(uint32_t*)addr) - 0x20000000) < (SRAM_SIZE * 1024))
	{
		/* 关闭外设时钟 */
   
		/* 关闭外设中断并清除中断标志 */
   
		jump_to_app = (iapfun)*(uint32_t*)(addr + 4); 	// 函数指向运行域		 
		__set_MSP(*(uint32_t*)addr);					// 设置堆栈指针
		jump_to_app();									// 跳转到用户程序	
	}
	/* 目标地址无效 */
	else
	{
		DBG_Error("Target address error");
	}
}
/**
***********************************************************
* @brief	向flash写2kb数据 
* @param 	地址，数据指针
* @return 
***********************************************************
*/
void app_flash_2kb_write(uint32_t write_addr, uint8_t *pbuffer)
{
	uint16_t index, write_data;  
	/* flash解锁 */
	flash_unlock();

	/* 擦除 */
	flash_sector_erase(write_addr);
	if(FLASH_SIZE < 0x100)  /* less than 256kb, 1kb/sector */
    	flash_sector_erase(write_addr + 0x400);

    /* 写入数据 */
	for(index = 0; index < 2048; index += 2)
	{
		write_data = (pbuffer[index+1] << 8) + pbuffer[index];
		flash_halfword_program(write_addr, write_data);
		write_addr += sizeof(uint16_t);
	}

	/* 锁定flash */
	flash_lock();
}


